package manage.commons.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.util.CollectionUtils;

/**
 * 
 * Description：通用工具类
 * 
 * @since：2012-8-17 下午09:20:38
 * @author dongji
 * 
 */
public final class CommonUtil {

	private CommonUtil() {
	}

	/**
	 * bean to string style
	 * 
	 * @param <T>
	 * @param bean
	 * @return
	 */
	public static <T> String beanPropertisToString(T bean) {
		return ReflectionToStringBuilder.toString(bean,
				ToStringStyle.SHORT_PREFIX_STYLE);
	}

	/**
	 * 
	 * @param str
	 *            要分隔的字符串
	 * @param regex
	 *            分隔符
	 * @return
	 */
	public static List<Integer> evalStringToList(String str, String regex) {
		if (StringUtils.isEmpty(str) || StringUtils.isEmpty(regex))
			return null;
		List<Integer> spiltList = new ArrayList<Integer>();
		if (StringUtils.isNotBlank(str) && StringUtils.isNotBlank(regex)) {
			String[] spiltArray = str.split(regex);
			for (String element : spiltArray) {
				spiltList.add(Integer.parseInt(element));
			}
		}
		return spiltList;
	}

	/**
	 * 默认以','分割
	 * 
	 * @param str
	 * @return
	 */
	public static List<Integer> evalStringToList(String str) {
		return evalStringToList(str, ",");
	}

	/**
	 * string数组变集合
	 * 
	 * @param str
	 * @return
	 */
	public static List<Integer> evalStringArrayToIntegrList(String[] str) {
		if (ArrayUtils.isEmpty(str))
			return null;
		List<Integer> addList = new ArrayList<Integer>();
		for (String element : str) {
			addList.add(Integer.parseInt(element));
		}
		return addList;
	}

	/**
	 * string to array ,split by ','
	 * 
	 * @param str
	 * @return
	 */
	public static String[] evalStringToArray(String str) {
		String[] array = null;
		if (str != null) {
			array = str.split(",");
		}
		return array;
	}

	/**
	 * change string array to int array
	 * 
	 * @param str
	 * @return
	 */
	public static int[] evalIntArray(String[] str) {
		if (ArrayUtils.isEmpty(str))
			return null;
		int[] arrs = new int[str.length];
		for (int i = 0; i < str.length; i++) {
			arrs[i] = Integer.parseInt(str[i].trim());
		}
		return arrs;
	}

	public static List<Long> evalStringArrayToLongList(String[] str) {
		if (ArrayUtils.isEmpty(str))
			return null;
		List<Long> addList = new ArrayList<Long>();
		for (String element : str) {
			addList.add(Long.parseLong(element));
		}
		return addList;
	}

	/**
	 * change string array to long array
	 * 
	 * @param str
	 * @return
	 */
	public static Long[] evalLongArray(String[] str) {
		if (ArrayUtils.isEmpty(str))
			return null;
		Long[] arrs = new Long[str.length];
		for (int i = 0; i < str.length; i++) {
			arrs[i] = Long.parseLong(str[i].trim());
		}
		return arrs;
	}

	/**
	 * 数组array是否包含single元素
	 * 
	 * @param <T>
	 * @param single
	 * @param array
	 * @return
	 */
	public static <T> boolean contains(T single, T[] array) {
		for (T element : array) {
			if (StringUtils.equals(String.valueOf(element),
					String.valueOf(single))) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 主要方便数据库数据和页面传过来的ID'S做比较，看相对少了哪些ID：比如数据库中有{1,2,3,4}页面取值为{2,3}，返回为{1,4}
	 * 
	 * @param <T>
	 * @param srcList
	 *            源ID集合,数据库中的值
	 * @param compartorArray
	 *            新ID数组,页面传来的
	 * @return
	 */
	public static <T extends Number> List<T> operatorReduceValue(
			List<T> srcList, T[] compartorArray) {
		if (ArrayUtils.isEmpty(compartorArray))
			return srcList;
		if (CollectionUtils.isEmpty(srcList))
			return null;
		List<T> reduceList = new ArrayList<T>();
		for (T id : srcList) {
			if (!contains(id, compartorArray)) {
				reduceList.add(id);
			}
		}
		return reduceList;
	}

	/**
	 * 要方便数据库数据和页面传过来的ID'S做比较，看相对加了哪些ID：比如数据库中有{1,2,3,4}页面取值为{2,3,5,9}，返回为{5,9}
	 * 
	 * @param <T>
	 * @param srcArray
	 *            页面传来的
	 * @param compartorList
	 *            数据库中的值
	 * @return
	 */
	public static <T extends Number> List<T> operatorAddValue(T[] srcArray,
			List<T> compartorList) {
		if (ArrayUtils.isEmpty(srcArray))
			return null;
		if (CollectionUtils.isEmpty(compartorList))
			return Arrays.asList(srcArray);
		List<T> addList = new ArrayList<T>();
		for (T id : srcArray) {
			if (!compartorList.contains(id)) {
				addList.add(id);
			}
		}
		return addList;
	}

	/**
	 * 主要方便数据库数据和页面传过来的ID'S做比较，看相对哪些ID没有发生改变：比如数据库中有{1,2,3,4}页面取值为{2,3}，返回为{2,3}
	 * 
	 * @param <T>
	 * @param srcList
	 *            源ID集合,数据库中的值
	 * @param compartorArray
	 *            新ID数组,页面传来的
	 * @return
	 */
	public static <T extends Number> List<T> operatorNoChangeValue(
			List<T> srcList, T[] compartorArray) {
		if (ArrayUtils.isEmpty(compartorArray)
				|| CollectionUtils.isEmpty(srcList))
			return null;
		List<T> noChangeList = new ArrayList<T>();
		for (T id : srcList) {
			if (contains(id, compartorArray)) {
				noChangeList.add(id);
			}
		}
		return noChangeList;
	}
}
